// -*- coding: utf-8 -*- 
/**
 * Project: AlgorithmsLearn
 * Creator: yanking
 * Create time: 2022-02-22 14:55
 * IDE: IntelliJ IDEA
 * Introduction:
 */
package com.leetCode.isRobotBounded;

public class isRobotBounded_ {
    String[] direction = {"North", "South", "East", "West"}; // 用于记录当前机器人的方向
    String nD = "North";

    // 根据已知的移动和转向指令判断及机器人是否在原地运动
    // 如果机器人原地做环形运动则最后运动的位置一定是原点
    // 使用坐标表示机器人位置，初始位置为（0,0），需要额外的变量存储机器人当前的方向变量
    // G指令根据机器人当前的方向变量向前移动一格，方向指令更改机器人的方向变量但是不进行移动
    // GL 指令执行一次并不会直接返回原点，运行四次之后才会返回原点
    // 每一次只改变一个方向和移动一次只需要四次就会回到原点
    // 走完一轮之后只要方向改变，肯定会回到原点


    public boolean isRobotBounded(String instructions) {
        int x = 0, y = 0; // 初始坐标，用于定位当前位置

        for (int i = 0; i < instructions.length(); i++) {
            char m = instructions.charAt(i);
            if (m == 'G') {
                x = move(x, y, nD)[0];
                y = move(x, y, nD)[1];
            } else {
                nD = changeDirection(nD, m);
            }
        }

        return !nD.equals("North") || (x == 0 & y == 0);
    }


    // To change the direction of the robot
    public String changeDirection(String nD, char m) {
        String[] North = {"West", "East"};
        String[] South = {"East", "West"};
        String[] East = {"North", "South"};
        String[] West = {"South", "North"};
        if (nD.equals("North")) {
            if (m == 'L') {
                return North[0];
            } else {
                return North[1];
            }
        }
        if (nD.equals("West")) {
            if (m == 'L') {
                return West[0];
            } else {
                return West[1];
            }
        }
        if (nD.equals("South")) {
            if (m == 'L') {
                return South[0];
            } else {
                return South[1];
            }
        }
        if (nD.equals("East")) {
            if (m == 'L') {
                return East[0];
            } else {
                return East[1];
            }
        }
        return null;
    }

    // realize the moving of the robot
    public int[] move(int x, int y, String nD) {
        if (nD.equals("North")) {
            ++y;
        }
        if (nD.equals("West")) {
            --x;
        }
        if (nD.equals("South")) {
            --y;
        }
        if (nD.equals("East")) {
            ++x;
        }
        return new int[]{x, y};
    }


}
